Implement xm block-configure for CD-ROMs.
authoremellor@leeni.uk.xensource.com <emellor@leeni.uk.xensource.com>
Wed, 16 Aug 2006 11:59:30 +0000 (12:59 +0100)
committeremellor@leeni.uk.xensource.com <emellor@leeni.uk.xensource.com>
Wed, 16 Aug 2006 11:59:30 +0000 (12:59 +0100)
Signed-off-by: Ewan Mellor <ewan@xensource.com>
tools/python/xen/xend/XendDomainInfo.py
tools/python/xen/xend/server/DevController.py
tools/python/xen/xend/server/XMLRPCServer.py
tools/python/xen/xend/server/blkif.py
tools/python/xen/xm/main.py

index daedcff625b3b64c45dc6a006ee96ca9c3129848..3bc69981e860729be97084426ff47564db271a35 100644 (file)
@@ -1527,13 +1527,12 @@ class XendDomainInfo:
         return self.getDeviceController(dev_type).sxpr(devid)
 
 
-    def device_configure(self, dev_config, devid):
+    def device_configure(self, dev_config):
         """Configure an existing device.
         @param dev_config: device configuration
-        @param devid:      device id
         """
         deviceClass = sxp.name(dev_config)
-        self.reconfigureDevice(deviceClass, devid, dev_config)
+        self.reconfigureDevice(deviceClass, None, dev_config)
 
 
     def pause(self):
index 80d7e85dd2161f0d76775c14779adf57b67f58fb..92e298c9df7eed7ce164b91ee9f855d5abcf7680 100644 (file)
@@ -206,15 +206,9 @@ class DevController:
         """
 
         devid = int(devid)
-        
-        frontpath = self.frontendPath(devid)
-        backpath = xstransact.Read(frontpath, "backend")
 
-        if backpath:
-            xstransact.Write(backpath, 'state', str(xenbusState['Closing']))
-        else:
-            raise VmError("Device %s not connected" % devid)
-           
+        self.writeBackend(devid, 'state', str(xenbusState['Closing']))
+
 
     def configurations(self):
         return map(self.configuration, self.deviceIDs())
@@ -355,6 +349,16 @@ class DevController:
             return map(int, xstransact.List(fe))
 
 
+    def writeBackend(self, devid, *args):
+        frontpath = self.frontendPath(devid)
+        backpath = xstransact.Read(frontpath, "backend")
+
+        if backpath:
+            xstransact.Write(backpath, *args)
+        else:
+            raise VmError("Device %s not connected" % devid)
+
+
 ## private:
 
     def addStoreEntries(self, config, devid, backDetails, frontDetails):
index b1a288d84bce4aebef74c380e69fb6cf0b569ab2..aebffa7eede1aba406d4ece79f46d7a37c525e3e 100644 (file)
@@ -24,6 +24,7 @@ from xen.util.xmlrpclib2 import UnixXMLRPCServer, TCPXMLRPCServer
 
 from xen.xend.XendClient import XML_RPC_SOCKET, ERROR_INVALID_DOMAIN
 from xen.xend.XendError import *
+from xen.xend.XendLogging import log
 from types import ListType
 
 def lookup(domid):
@@ -74,7 +75,8 @@ def get_log():
     finally:
         f.close()
 
-methods = ['device_create', 'destroyDevice', 'getDeviceSxprs',
+methods = ['device_create', 'device_configure', 'destroyDevice',
+           'getDeviceSxprs',
            'setMemoryTarget', 'setName', 'setVCpuCount', 'shutdown',
            'send_sysrq', 'getVCPUInfo', 'waitForDevices']
 
index 0039900eaaec8ed9d058fc406cb63da1f55afe0b..0d895c71b74835f84206b605c1633ca031657684 100644 (file)
@@ -13,7 +13,7 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 #============================================================================
 # Copyright (C) 2004, 2005 Mike Wray <mike.wray@hp.com>
-# Copyright (C) 2005 XenSource Ltd
+# Copyright (C) 2005, 2006 XenSource Inc.
 #============================================================================
 
 
@@ -76,6 +76,23 @@ class BlkifController(DevController):
         return (devid, back, front)
 
 
+    def reconfigureDevice(self, _, config):
+        """@see DevController.reconfigureDevice"""
+        (devid, new_back, new_front) = self.getDeviceDetails(config)
+
+        (dev, mode) = self.readBackend(devid, 'dev', 'mode')
+        dev_type = self.readFrontend(devid, 'device-type')
+
+        if (dev_type == 'cdrom' and new_front['device-type'] == 'cdrom' and
+            dev == new_back['dev'] and mode == 'r'):
+            self.writeBackend(devid,
+                              'type', new_back['type'],
+                              'params', new_back['params'])
+        else:
+            raise VmError('Refusing to reconfigure device %s:%d to %s' %
+                          (self.deviceClass, devid, config))
+
+
     def configuration(self, devid):
         """@see DevController.configuration"""
 
index 62b7a76f144fc87afcc207e3ebf88d9ff14d638d..888b7ac329ba2d243a4d658087a2c2211ed3e25e 100644 (file)
@@ -113,6 +113,8 @@ block_detach_help = """block-detach  <DomId> <DevId>    Destroy a domain's virtu
                                     or the device name as mounted in the guest"""
 
 block_list_help = "block-list <DomId> [--long]      List virtual block devices for a domain"
+block_configure_help = """block-configure <DomId> <BackDev> <FrontDev> <Mode>
+                   [BackDomId] Change block device configuration"""
 network_attach_help = """network-attach  <DomID> [script=<script>] [ip=<ip>] [mac=<mac>]
                            [bridge=<bridge>] [backend=<backDomID>]
                                     Create a new virtual network device """
@@ -199,6 +201,7 @@ device_commands = [
     "block-attach",
     "block-detach",
     "block-list",
+    "block-configure",
     "network-attach",
     "network-detach",
     "network-list",
@@ -1055,9 +1058,8 @@ def xm_vtpm_list(args):
                    "%(be-path)-30s  "
                    % ni)
 
-def xm_block_attach(args):
-    arg_check(args, 'block-attach', 4, 5)
 
+def parse_block_configuration(args):
     dom = args[0]
 
     if args[1].startswith('tap:'):
@@ -1087,9 +1089,23 @@ def xm_block_attach(args):
         traceback.print_exc(limit=1)
         sys.exit(1)
 
+    return (dom, vbd)
+
+
+def xm_block_attach(args):
+    arg_check(args, 'block-attach', 4, 5)
+
+    (dom, vbd) = parse_block_configuration(args)
     server.xend.domain.device_create(dom, vbd)
 
 
+def xm_block_configure(args):
+    arg_check(args, 'block-configure', 4, 5)
+
+    (dom, vbd) = parse_block_configuration(args)
+    server.xend.domain.device_configure(dom, vbd)
+
+
 def xm_network_attach(args):
     arg_check(args, 'network-attach', 1, 10000)
 
@@ -1201,6 +1217,7 @@ commands = {
     "block-attach": xm_block_attach,
     "block-detach": xm_block_detach,
     "block-list": xm_block_list,
+    "block-configure": xm_block_configure,
     # network
     "network-attach": xm_network_attach,
     "network-detach": xm_network_detach,